/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * PantallaEstudianteExamen.java
 *
 * Created on 30-abr-2012, 23:56:21
 */

package edu.uoc.tds.pec4.swingx;

import edu.uoc.tds.pec4.common.RemotoInterface;
import edu.uoc.tds.pec4.exception.RespuestasEnDefecto;
import edu.uoc.tds.pec4.exception.RespuestasEnExceso;
import edu.uoc.tds.pec4.i18n.GestorIdiomas;
import edu.uoc.tds.pec4.model.Estudiante;
import edu.uoc.tds.pec4.model.Pregunta;
import edu.uoc.tds.pec4.model.Prueba;
import edu.uoc.tds.pec4.model.Ronda;
import edu.uoc.tds.pec4.model.TipoRonda;
import edu.uoc.tds.pec4.model.Usuario;
import java.rmi.RemoteException;
import java.rmi.Naming;
import java.util.List;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Esteban
 */
public class PantallaEstudianteExamen extends javax.swing.JDialog {
    private PantallaMenuPrincipal pantallaMenuPrincipal;
    private RemotoInterface remoto;

    private Ronda ronda;
    private Estudiante estudiante;
   
    /** Creates new form PantallaPruebas */
    public PantallaEstudianteExamen(PantallaMenuPrincipal pantallaMenuPrincipal, Ronda ronda,boolean modal) throws RemoteException
    {
        this.pantallaMenuPrincipal = pantallaMenuPrincipal;
        this.remoto = pantallaMenuPrincipal.getRemoto();
        this.estudiante = (Estudiante)pantallaMenuPrincipal.getUsuario();
        this.ronda = ronda;

        initComponents();
        CargaIdioma();
        myInitComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jToolBarraHerramientas = new javax.swing.JToolBar();
        jSeparator4 = new javax.swing.JToolBar.Separator();
        btnExit = new javax.swing.JButton();
        jPanelPruebas = new javax.swing.JPanel();
        jScrollPanePruebas = new javax.swing.JScrollPane();
        jtablePreguntas = new javax.swing.JTable();
        txtEstudiante = new javax.swing.JTextField();
        txtUniversidad = new javax.swing.JTextField();
        jlEstudiante = new javax.swing.JLabel();
        jlUniversidad = new javax.swing.JLabel();
        jlTiempo = new javax.swing.JLabel();
        jlTituloPpal = new javax.swing.JLabel();
        jbtnEnviar = new javax.swing.JButton();
        jbtnLimpiar = new javax.swing.JButton();
        jbtnCancelar = new javax.swing.JButton();
        jmnuBarPruebas = new javax.swing.JMenuBar();
        jmnuArchivo = new javax.swing.JMenu();
        jmnuSalir = new javax.swing.JMenuItem();
        jmnuAyuda = new javax.swing.JMenu();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("eOlympics - Inscripcion");

        jToolBarraHerramientas.setRollover(true);
        jToolBarraHerramientas.add(jSeparator4);

        btnExit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/Exit.png"))); // NOI18N
        btnExit.setToolTipText("Salir");
        btnExit.setFocusable(false);
        btnExit.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btnExit.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btnExit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExitsalir(evt);
            }
        });
        jToolBarraHerramientas.add(btnExit);

        jtablePreguntas.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Pregunta", "A", "B", "C", "D", "En blanco"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.Boolean.class, java.lang.Boolean.class, java.lang.Boolean.class, java.lang.Boolean.class, java.lang.Boolean.class
            };
            boolean[] canEdit = new boolean [] {
                false, true, true, true, true, true
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jScrollPanePruebas.setViewportView(jtablePreguntas);

        txtEstudiante.setEditable(false);

        txtUniversidad.setEditable(false);

        jlEstudiante.setText("Estudiante:");

        jlUniversidad.setText("Universidad:");

        jlTiempo.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlTiempo.setForeground(new java.awt.Color(153, 0, 51));
        jlTiempo.setText("Queda..");

        jlTituloPpal.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlTituloPpal.setForeground(new java.awt.Color(102, 102, 255));
        jlTituloPpal.setText("(prueba)");

        jbtnEnviar.setText("Enviar");
        jbtnEnviar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnEnviarActionPerformed(evt);
            }
        });

        jbtnLimpiar.setText("Limpiar");
        jbtnLimpiar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnLimpiarActionPerformed(evt);
            }
        });

        jbtnCancelar.setText("Cancelar");
        jbtnCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnCancelarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanelPruebasLayout = new javax.swing.GroupLayout(jPanelPruebas);
        jPanelPruebas.setLayout(jPanelPruebasLayout);
        jPanelPruebasLayout.setHorizontalGroup(
            jPanelPruebasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelPruebasLayout.createSequentialGroup()
                .addGap(18, 18, 18)
                .addGroup(jPanelPruebasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanelPruebasLayout.createSequentialGroup()
                        .addComponent(jlEstudiante)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txtEstudiante, javax.swing.GroupLayout.DEFAULT_SIZE, 284, Short.MAX_VALUE)
                        .addGap(36, 36, 36))
                    .addGroup(jPanelPruebasLayout.createSequentialGroup()
                        .addComponent(jlTituloPpal, javax.swing.GroupLayout.PREFERRED_SIZE, 373, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)))
                .addGroup(jPanelPruebasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(jPanelPruebasLayout.createSequentialGroup()
                        .addComponent(jlUniversidad)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txtUniversidad, javax.swing.GroupLayout.PREFERRED_SIZE, 177, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jlTiempo, javax.swing.GroupLayout.PREFERRED_SIZE, 220, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelPruebasLayout.createSequentialGroup()
                .addContainerGap(216, Short.MAX_VALUE)
                .addComponent(jbtnEnviar)
                .addGap(18, 18, 18)
                .addComponent(jbtnLimpiar)
                .addGap(18, 18, 18)
                .addComponent(jbtnCancelar)
                .addGap(187, 187, 187))
            .addGroup(jPanelPruebasLayout.createSequentialGroup()
                .addGap(105, 105, 105)
                .addComponent(jScrollPanePruebas, javax.swing.GroupLayout.PREFERRED_SIZE, 427, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(116, Short.MAX_VALUE))
        );
        jPanelPruebasLayout.setVerticalGroup(
            jPanelPruebasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelPruebasLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanelPruebasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlEstudiante)
                    .addComponent(txtEstudiante, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jlUniversidad)
                    .addComponent(txtUniversidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(jPanelPruebasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlTituloPpal)
                    .addComponent(jlTiempo))
                .addGap(18, 18, 18)
                .addComponent(jScrollPanePruebas, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(11, 11, 11)
                .addGroup(jPanelPruebasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jbtnLimpiar)
                    .addComponent(jbtnCancelar)
                    .addComponent(jbtnEnviar))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jmnuArchivo.setText("Archivo");
        jmnuArchivo.setFont(new java.awt.Font("Tahoma", 1, 11));

        jmnuSalir.setText("Salir");
        jmnuArchivo.add(jmnuSalir);

        jmnuBarPruebas.add(jmnuArchivo);

        jmnuAyuda.setText("Ayuda");
        jmnuAyuda.setFont(new java.awt.Font("Tahoma", 1, 11));
        jmnuBarPruebas.add(jmnuAyuda);

        setJMenuBar(jmnuBarPruebas);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jToolBarraHerramientas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(595, Short.MAX_VALUE))
            .addComponent(jPanelPruebas, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jToolBarraHerramientas, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanelPruebas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void btnExitsalir(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExitsalir
        // TODO add your handling code here:
        this.setVisible(false);
}//GEN-LAST:event_btnExitsalir

    // Limpia respuestas
    private void jbtnLimpiarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnLimpiarActionPerformed

        if(JOptionPane.showConfirmDialog(null, GestorIdiomas.getMessage("PantallaEstudianteExamen.ConfirmaLimpiar")) == 0)
            limpiarTabla();
}//GEN-LAST:event_jbtnLimpiarActionPerformed

    //Alta en prueba
    private void jbtnEnviarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnEnviarActionPerformed

        if(JOptionPane.showConfirmDialog(null, GestorIdiomas.getMessage("PantallaEstudianteExamen.ConfirmaEnviar")) == 0)
        {
            try
            {
                String respuestas = compruebaRespuestas();
                if(this.remoto.guardarRespuestasUsuarios(estudiante, ronda, respuestas))
                {
                    JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("PantallaEstudianteExamen.InfoPruebaGuardada"), GestorIdiomas.getMessage("informacion"), JOptionPane.INFORMATION_MESSAGE);
                    this.setVisible(false);
                }
                else
                    JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("PantallaEstudianteExamen.InfoPruebaNoGuardada"), GestorIdiomas.getMessage("informacion"), JOptionPane.INFORMATION_MESSAGE);
            }
            catch (RespuestasEnDefecto exc) {
                JOptionPane.showMessageDialog(this, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            }
            catch (RespuestasEnExceso exc) {
                JOptionPane.showMessageDialog(this, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            }
            catch (RemoteException exc) {
                exc.printStackTrace();
                JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            }
            catch (Exception exc) {
                exc.printStackTrace();
                JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            }
        }
    }//GEN-LAST:event_jbtnEnviarActionPerformed

    private void jbtnCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnCancelarActionPerformed
        if(JOptionPane.showConfirmDialog(null, GestorIdiomas.getMessage("PantallaEstudianteExamen.ConfirmaCancelar")) == 0)
            this.setVisible(false);
    }//GEN-LAST:event_jbtnCancelarActionPerformed

    /**
    * @param args the command line arguments
    */
    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {

                GestorIdiomas.setDefaultLanguage("i18n/messages");

                PantallaEstudianteExamen dialog = null;
                try {
                    PantallaMenuPrincipal ppal = cargaPpal();

                    Prueba prueba = ppal.getRemoto().getPrueba(2);
                    Ronda ronda = ppal.getRemoto().getRonda(prueba, TipoRonda.CLASIFICATORIA);

                    dialog = new PantallaEstudianteExamen(ppal,ronda,true);
                }

                catch (RemoteException ex) {
                    Logger.getLogger(PantallaEstudianteInscripcion.class.getName()).log(Level.SEVERE, null, ex);
                }

                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }

    public static PantallaMenuPrincipal cargaPpal()
    {
         PantallaMenuPrincipal pantallaMenuPrincipal = null;
         try {

            RemotoInterface remoto = (RemotoInterface) Naming.lookup("rmi://localhost/eOlympics");

            //JOptionPane.showMessageDialog(null, "Conectado RMI");

            remoto.conectaBBDD();

            Usuario usuario = remoto.validarUsuario("JPG", "1234");

            pantallaMenuPrincipal = new PantallaMenuPrincipal(usuario,remoto);

            //pantallaMenuPrincipal.setVisible(true);

        }

        catch (Exception exc)
        {
            exc.printStackTrace();
            JOptionPane.showMessageDialog(null,"cargaPPal(): " + exc.getMessage());
        }

        return pantallaMenuPrincipal;
    }

    private void CargaIdioma()
    {
        //Llamando al gestor de idiomas para los menus y etiquetas de controles
        this.jmnuArchivo.setText(GestorIdiomas.getMessage("menu.archivo.text"));
        this.jmnuSalir.setText(GestorIdiomas.getMessage("menu.salir.text"));
        this.jmnuAyuda.setText(GestorIdiomas.getMessage("menu.ayuda.text"));

        this.jlEstudiante.setText(GestorIdiomas.getMessage("PantallaEstudianteExamen.jlEstudiante"));
        this.jlUniversidad.setText(GestorIdiomas.getMessage("PantallaEstudianteExamen.jlUniversidad"));
        this.jbtnEnviar.setText(GestorIdiomas.getMessage("PantallaEstudianteExamen.jbtnEnviar"));
        this.jbtnLimpiar.setText(GestorIdiomas.getMessage("PantallaEstudianteExamen.jbtnLimpiar"));
        this.jbtnCancelar.setText(GestorIdiomas.getMessage("PantallaEstudianteExamen.jbtnCancelar"));
                
        this.setTitle(GestorIdiomas.getMessage("PantallaEstudianteExamen.Titulo"));
    }

    private int CalculaHorasEntreFechas(Date fechaMayor, Date fechaMenor)
    {
        long timeLimit = fechaMayor.getTime() - fechaMenor.getTime();
        double horas = Math.floor(timeLimit / (1000 * 60 * 60));

        return (int)horas;
    }

    private void myInitComponents() 
    {
        try
        {
            txtEstudiante.setText(estudiante.toString());
            txtUniversidad.setText(estudiante.getUniversidad().getNombre());

            Prueba prueba = this.remoto.getPrueba(ronda.getId_prueba());
            jlTituloPpal.setText(GestorIdiomas.getMessage("PantallaEstudianteExamen.jlTituloPpal") + " " +
                    prueba.getDescripcion_prueba() + " - " +
                    this.remoto.getDescripcionTipoRonda(ronda.getId_tipo_ronda()));

            jlTiempo.setText(GestorIdiomas.getMessage("PantallaEstudianteExamen.jlTiempo") + " " +
                    (CalculaHorasEntreFechas(ronda.getFecha_fin_realizacion(), new Date()) + 1) + " " +
                    GestorIdiomas.getMessage("PantallaEstudianteExamen.jlTiempoHoras"));

            this.limpiarTabla();
        }

        catch (RemoteException exc) {
            exc.printStackTrace();
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }

        catch (Exception exc) {
            exc.printStackTrace();
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
    }

    public void limpiarTabla()
    {
        int numPreguntas = ronda.getNumero_preguntas();
       // List<Pregunta> ListaPreguntas = remoto.getListaPreguntas(numPreguntas);
        
        try
        {
            Object datos[][] = new Object[numPreguntas][6];

            for(int i=0 ; i<numPreguntas ; i++)
            {
                datos[i][0] = remoto.getPregunta(i+1).getTextoPregunta();
                datos[i][1] = false;
                datos[i][2] = false;
                datos[i][3] = false;
                datos[i][4] = false;
                datos[i][5] = false;
            }

            this.jtablePreguntas.setModel(new javax.swing.table.DefaultTableModel(
                datos,
            new String [] {
                GestorIdiomas.getMessage("PantallaEstudianteExamen.CampoListado1"),
                GestorIdiomas.getMessage("PantallaEstudianteExamen.CampoListado2"),
                GestorIdiomas.getMessage("PantallaEstudianteExamen.CampoListado3"),
                GestorIdiomas.getMessage("PantallaEstudianteExamen.CampoListado4"),
                GestorIdiomas.getMessage("PantallaEstudianteExamen.CampoListado5"),
                GestorIdiomas.getMessage("PantallaEstudianteExamen.CampoListado6")
            }

                ) {
                    Class[] types = new Class [] {
                        java.lang.String.class, java.lang.Boolean.class, java.lang.Boolean.class, java.lang.Boolean.class, java.lang.Boolean.class, java.lang.Boolean.class
                    };
                    boolean[] canEdit = new boolean [] {
                        false, true, true, true, true, true
                    };


                    public Class getColumnClass(int columnIndex) {
                        return types [columnIndex];
                    }

                    public boolean isCellEditable(int rowIndex, int columnIndex) {
                        return canEdit [columnIndex];
                    }
                });
             }

        catch(Exception exc){
           // JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            JOptionPane.showMessageDialog(null,"limpiaTabla: "+ exc.getMessage());
        }
    }

    public String compruebaRespuestas() throws RespuestasEnDefecto,RespuestasEnExceso
    {
        StringBuilder todasRespuestas = new StringBuilder();
        for(int fila=0; fila< jtablePreguntas.getRowCount(); fila++)
        {
            int numTrue = 0;
            for(int col = 1; col < jtablePreguntas.getColumnCount() ; col++)
            {
                if(Boolean.parseBoolean(jtablePreguntas.getValueAt(fila, col).toString()))
                {
                    todasRespuestas.append(GetValorRespuesta(col));
                    numTrue++;
                }
            }

            if(numTrue < 1)
                throw new RespuestasEnDefecto();
            else if(numTrue > 1)
                throw new RespuestasEnExceso();
        }
        return todasRespuestas.toString();
    }

    private String GetValorRespuesta(int columna)
    {
        switch(columna)
        {
            case 1:
                return "A";
            case 2:
                return "B";
            case 3:
                return "C";
            case 4:
                return "D";
            default:
                return "0";
        }
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnExit;
    private javax.swing.JPanel jPanelPruebas;
    private javax.swing.JScrollPane jScrollPanePruebas;
    private javax.swing.JToolBar.Separator jSeparator4;
    private javax.swing.JToolBar jToolBarraHerramientas;
    private javax.swing.JButton jbtnCancelar;
    private javax.swing.JButton jbtnEnviar;
    private javax.swing.JButton jbtnLimpiar;
    private javax.swing.JLabel jlEstudiante;
    private javax.swing.JLabel jlTiempo;
    private javax.swing.JLabel jlTituloPpal;
    private javax.swing.JLabel jlUniversidad;
    private javax.swing.JMenu jmnuArchivo;
    private javax.swing.JMenu jmnuAyuda;
    private javax.swing.JMenuBar jmnuBarPruebas;
    private javax.swing.JMenuItem jmnuSalir;
    private javax.swing.JTable jtablePreguntas;
    private javax.swing.JTextField txtEstudiante;
    private javax.swing.JTextField txtUniversidad;
    // End of variables declaration//GEN-END:variables

}
